#include<cstdio>
#include<cstring>
const int maxn=12;
int dp[1<<10][maxn],g[maxn][maxn];
int n;
char dic[maxn][3*maxn];
int max(int x,int y)
{
	return x>y?x:y;
}
int work(int a,int b)
{
	int ans=0;
	for(int i=0;i<strlen(dic[a]);i++)
	{
		int cnt=0;
		for(int j=0;j<strlen(dic[b])&&i+j<strlen(dic[a]);j++)
			if(dic[a][i+j]==dic[b][j])cnt++;
		ans=max(ans,cnt);
	}
	for(int i=0;i<strlen(dic[b]);i++)
	{
		int cnt=0;
		for(int j=0;j<strlen(dic[a])&&i+j<strlen(dic[b]);j++)
			if(dic[b][i+j]==dic[a][j])cnt++;
		ans=max(ans,cnt);
	}
	return ans;
}
int main()
{
	while(scanf("%d",&n)&&n>0)
	{
		for(int i=1;i<=n;i++)
			scanf("%s",dic[i]);
		memset(g,0,sizeof(g));
		for(int i=1;i<n;i++)
			for(int j=i+1;j<=n;j++)
				g[i][j]=g[j][i]=work(i,j);
		memset(dp,0,sizeof(dp));
		for(int s=3;s<= (1<<n)-1;s++)
			for(int i=1;i<=n;i++)
				if(1<<(i-1)&s)
				for(int k=1;k<=n;k++)
					if(i!=k&&1<<(k-1)&s)
					dp[s][i]=max(dp[s-(1<<(i-1))][k]+g[k][i],dp[s][i]);
		int state=1<<n;state--;
		int ans=0;
		for(int i=1;i<=n;i++)ans=max(ans,dp[state][i]);
		printf("%d\n",ans);
	}
	return 0;
}


